﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades.Catalogo;
using System.Configuration;
using System.Data;
using Oracle.DataAccess.Client;

namespace Persistencia.Catalogo
{
    public class PerUsuario : Persistencia.General.IPersistencia
    {
        #region Miembros de IPersistencia

        public void Insertar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();

          //string a = "Data Source=(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=ORCL))); User Id=hr;Password=hr;";
        }

        public void Actualizar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public Entidades.General.IEntidad Obtener(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntUsuario entUsuario = null;

            try
            {
                comando = new OracleCommand("PKG_CATALOGOS.getUsuario", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter usuario = new OracleParameter();
                usuario.OracleDbType = OracleDbType.Varchar2;
                usuario.Value = ((EntUsuario)entidad).NombreUsuario;
                usuario.Direction = ParameterDirection.Input;
                comando.Parameters.Add(usuario);

                OracleParameter contrasenia = new OracleParameter();
                contrasenia.OracleDbType = OracleDbType.Varchar2;
                contrasenia.Value = ((EntUsuario)entidad).Contrasenia;
                contrasenia.Direction = ParameterDirection.Input;
                comando.Parameters.Add(contrasenia);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);


                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entUsuario = new EntUsuario();
                    entUsuario.CveUsuario = int.Parse(lector["Cve_Usuario"] == DBNull.Value ? "0" : lector["Cve_Usuario"].ToString());
                    entUsuario.Nombre = lector["Nombre"].ToString();
                    entUsuario.Paterno = lector["Apellido_P"].ToString();
                    entUsuario.Materno = lector["Apellido_M"].ToString();
                    entUsuario.Contrasenia = lector["Contrasenia"].ToString();
                    entUsuario.CveRol = int.Parse(lector["CVE_ROL"].ToString());
                    entUsuario.CveArea = lector["CVE_AREA"].ToString();
                    entUsuario.Rol = lector["desc_rol"].ToString();
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.Obtener";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.Obtener";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return entUsuario;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntUsuario entUsuario = null;
            List<Entidades.General.IEntidad> listaUsuarios = new List<Entidades.General.IEntidad>();

            try
            {
                comando = new OracleCommand("PKG_CATALOGOS.getPersonas", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter rol = new OracleParameter();
                rol.OracleDbType = OracleDbType.Varchar2;
                rol.Value = ((EntUsuario)entidad).CveRol.ToString();
                rol.Direction = ParameterDirection.Input;
                comando.Parameters.Add(rol);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entUsuario = new EntUsuario();
                    entUsuario.CveUsuario = int.Parse(lector["Cve_Usuario"] == DBNull.Value ? "0" : lector["Cve_Usuario"].ToString());
                    entUsuario.Nombre = lector["Nombre"].ToString();

                    listaUsuarios.Add(entUsuario);
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.ObtenerTodos";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.ObtenerTodos";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return listaUsuarios;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Metodo Utilizado para la Pantalla de Afectados Particulas, Get Gestores
        /// </summary>
        /// <param name="entidad"></param>
        /// <returns></returns>
        public List<Entidades.General.IEntidad> ObtenerTodosAfectadosGestores(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntUsuario entUsuario = null;
            List<Entidades.General.IEntidad> listaUsuarios = new List<Entidades.General.IEntidad>();

            try
            {
                comando = new OracleCommand("PKG_CATALOGOS.getSubordinados", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter rol = new OracleParameter();
                rol.OracleDbType = OracleDbType.Varchar2;
                rol.Value = ((EntUsuario)entidad).CveUsuario.ToString();
                rol.Direction = ParameterDirection.Input;
                comando.Parameters.Add(rol);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entUsuario = new EntUsuario();
                    entUsuario.CveUsuario = int.Parse(lector["Cve_Usuario"] == DBNull.Value ? "0" : lector["Cve_Usuario"].ToString());
                    entUsuario.Nombre = lector["Nombre"].ToString();
                    entUsuario.Paterno = lector["Apellido_P"].ToString();
                    entUsuario.Materno = lector["Apellido_M"].ToString();
                    entUsuario.Contrasenia = lector["Contrasenia"].ToString();

                    entUsuario.Rol = lector["desc_rol"].ToString();

                    listaUsuarios.Add(entUsuario);
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.ObtenerTodosAfectadosGestores";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.ObtenerTodosAfectadosGestores";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return listaUsuarios;
        }    

        #endregion
    }
}
